#ifndef __DYNAMICARRAY_H_
#define __DYNAMICARRAY_H_


namespace DARRY
{

using ElementType = void* ;  
class DynamicArray
{
   
   public: 
     

        DynamicArray(); //无参构造函数
        DynamicArray(const DynamicArray &array);//拷贝构造函数
        void operator=(const DynamicArray &array); // 赋值运算符重载
        ElementType& operator[](int index);

        void SetFreeptr(void (*freeptr)(ElementType))
        {
            this->Freeptr = freeptr;
        }

        void SetCompare(bool (*compare)(ElementType,ElementType))
        {
            this->Compare = compare;
        }
        
        void SetCompareBig(bool (*comparebig)(ElementType,ElementType))
        {
            this->CompareBig = comparebig;
        }

        void SetCompareArray(bool (*compareArray)(DynamicArray,DynamicArray))
        {
            this->CompareArray = compareArray;
        }
        void SetPrint(void (*print)(ElementType))
        {
            this->Print = print;
        }


        // void SetIndex(ElementType (*index)(ElementType))
        // {
        //     this->IndexPtr = index;
        // }
        

        ~DynamicArray();//析构函数
        
        
        
        //拷贝构造    赋值运算符重载
        
        // 查找
        
        // 删除
        
        // 排序
        
        // 二分
        
        
        
        // InsertTail  尾插法
        void InsertTail(const ElementType&element);//加入



        // 头插法
        void InsertHead(const ElementType&element);



//    中间插入
        void InsertByIndex(const ElementType&element,int index);
        


        // 按值查找

        DynamicArray FindByElement(ElementType element); //查找

        // 按位置删除
        void RemovrByIndex(int Index);

        //按值删除    
        void RemovrByElement(ElementType element);  



        //按位置找 
        ElementType FindByIndex(int index);

        // 按位置修改
        void UpdateByIndex(int index,const ElementType&element);
        // 按值修改
        void UpdateByElement(const ElementType& oldValue,const ElementType&newValue);

        
        int BinarySearch(ElementType element);

        // void show();
        void show();
        
        //排序：递归深度

        void Sort();

        // 去重算法:去除数列中的相同值,只留一个
        void Duplicate();

        // 合并:合并两个有序数列
        DynamicArray Merge(const DynamicArray&a);

        // 找交集
        DynamicArray FindInterSection(const DynamicArray&array);



        // 找并集
        DynamicArray FindUnionSet(const DynamicArray &array);

        // 找补集
        DynamicArray FindDifference(const DynamicArray &array);

        bool operator==(const DynamicArray &array);


        // 判断是不是一个子数列
        bool IsChild(const DynamicArray &array);

        
        // 获取一个子序列
        DynamicArray Subsquence(int index,int len);
       
       
        // 判断是否是连续子序列
        bool IsConChild(const DynamicArray &array);

        int Size();

    private:

        void FastSort(int start , int end, int deepth, int MaxDeepth);//快速排序
        void InsertSort(int start, int end);
        
        int Partition(int start,int end);
       
        ElementType *a;
        int size;
        int capacity;

        void (*Freeptr)(ElementType);
        
        bool (*Compare)(ElementType,ElementType);
        bool (*CompareBig)(ElementType,ElementType);
        void (*Print)(ElementType);
        bool (*CompareArray)(DynamicArray,DynamicArray);
        // ElementType (*IndexPtr)(ElementType);
};




}

#endif